home *** CD-ROM | disk | FTP | other *** search
- /* AuditDocument.c */
- /*
- * DisplayAudit.c
- * Copyright © 1992-93, Apple Computer Inc. All Rights Reserved.
- * Programmed by Martin Minow,
- * Internet: minow@apple.com
- * AppleLink: MINOW
- * Note: During development, Think C keeps the application resources in a
- * different file from the application code. Hence, we must save and restore
- * the current resource file, not just blindly slam it back to the application
- * resource file.
- */
- #include "DisplayAudit.h"
- #include <Folders.h>
-
- /*
- * Open an existing AuditParameter file, or create a new one.
- */
- void
- OpenAuditParameterFile(void)
- {
- OSErr status;
- short saveResFile;
- long gestaltResult;
- short prefVRefNum;
- long prefDirID;
- FSSpec prefFSSpec; /* IM-VI 25-15, 25-30 */
- Str63 trueFileName;
- Boolean newResourceFile;
- StringHandle infoHandle; /* For finder info string */
- Str255 work; /* Gets default file name */
-
- newResourceFile = FALSE;
- infoHandle = NULL;
- saveResFile = CurResFile();
- TRY {
- FailOSErr(
- Gestalt(gestaltFindFolderAttr, &gestaltResult),
- kErrSystemVersion
- );
- FailOSErr(
- FindFolder(
- kOnSystemDisk,
- kPreferencesFolderType,
- kCreateFolder,
- &prefVRefNum,
- &prefDirID
- ),
- kErrFindPreferenceFolder
- );
- status = SearchForCreatorType(
- prefVRefNum,
- prefDirID,
- trueFileName
- );
- switch (status) {
- case noErr:
- /*
- * The preference file already exists.
- */
- status = FSMakeFSSpec(
- prefVRefNum,
- prefDirID,
- trueFileName,
- &prefFSSpec
- );
- FailOSErr(status, kErrOpenPreferenceFile);
- break;
- case fnfErr:
- /*
- * The preferences file did not exist. Create it. FSMakeFSSpec
- * will fail with a fnfErr. We're in trouble if it succeeds, as
- * someone else created a file with the same name and a different
- * owner type.
- */
- GetIndString(work, STRN_Strings, kAuditParameterFileName);
- status = FSMakeFSSpec(prefVRefNum, prefDirID, work, &prefFSSpec);
- if (status == noErr)
- status = dupFNErr;
- else if (status == fnfErr) {
- FSpCreateResFile(
- &prefFSSpec,
- kApplicationCreator,
- kPreferenceFileType,
- smRoman
- );
- status = ResError();
- newResourceFile = TRUE;
- }
- FailOSErr(status, kErrCreatePreferenceFile);
- break;
- default:
- FailOSErr(status, kErrFindPreferenceFile);
- break;
- }
- /*
- * The preference file existed, or could be created.
- */
- gParameterFileRefNum = FSpOpenResFile(&prefFSSpec, fsRdWrPerm);
- FailOSErr(ResError(), kErrOpenPreferenceFile);
- if (newResourceFile) {
- infoHandle = GetString(STR_FinderString);
- if (infoHandle != NULL) {
- DetachResource((Handle) infoHandle);
- UseResFile(gParameterFileRefNum);
- AddResource((Handle) infoHandle, 'STR ', STR_FinderIDString, "\p");
- FailOSErr(ResError(), kErrWritePreferenceResource);
- WriteResource((Handle) infoHandle);
- FailOSErr(ResError(), kErrWritePreferenceResource);
- DisposeHandle((Handle) infoHandle);
- infoHandle = NULL;
- FailOSErr(ResError(), kErrWritePreferenceResource);
- UpdateResFile(gParameterFileRefNum);
- FailOSErr(ResError(), kErrWritePreferenceResource);
- UseResFile(saveResFile);
- }
- }
- }
- CATCH {
- UseResFile(saveResFile);
- ErrorAlert(STATUS, MESSAGE, FALSE);
- if (gParameterFileRefNum != 0) {
- CloseResFile(gParameterFileRefNum);
- gParameterFileRefNum = 0;
- }
- if (infoHandle != NULL)
- DisposeHandle((Handle) infoHandle);
- ParameterFactorySettings();
- NO_PROPAGATE;
- }
- ENDTRY;
- }
-
- void
- ReadAuditParameters(void)
- {
- Handle parmHandle;
- short saveResFile;
-
- if (gParameterFileRefNum != 0) {
- saveResFile = CurResFile();
- TRY {
- UseResFile(gParameterFileRefNum);
- FailOSErr(ResError(), kErrReadPreferenceResource);
- parmHandle = GetResource(kApplicationCreator, PARM_ResourceID);
- if (parmHandle != NULL && GetHandleSize(parmHandle) == sizeof PARM)
- BlockMove(*parmHandle, &PARM, sizeof PARM);
- else {
- ParameterFactorySettings();
- gParameterUpdateNeeded = TRUE;
- }
- if (parmHandle != NULL) {
- ReleaseResource(parmHandle);
- FailOSErr(ResError(), kErrReadPreferenceResource);
- }
- }
- CATCH {
- UseResFile(saveResFile);
- ErrorAlert(STATUS, MESSAGE, FALSE);
- CloseResFile(gParameterFileRefNum);
- gParameterFileRefNum = 0;
- NO_PROPAGATE;
- }
- ENDTRY;
- UseResFile(saveResFile);
- }
- }
-
- void
- WriteAuditParameters(void)
- {
- Handle parmHandle;
- short saveResFile;
-
- if (gParameterFileRefNum != 0) {
- saveResFile = CurResFile();
- parmHandle = NULL;
- TRY {
- UseResFile(gParameterFileRefNum);
- FailOSErr(ResError(), kErrWritePreferenceResource);
- parmHandle = GetResource(
- kApplicationCreator,
- PARM_ResourceID
- );
- if (parmHandle != NULL) {
- /*
- * Update an existing parameter resource
- */
- FailOSErr(MemError(), kErrWritePreferenceResource);
- SetHandleSize(parmHandle, sizeof PARM);
- FailOSErr(MemError(), kErrWritePreferenceResource);
- BlockMove(&PARM, *parmHandle, sizeof PARM);
- ChangedResource(parmHandle);
- FailOSErr(ResError(), kErrWritePreferenceResource);
- }
- else {
- /*
- * Create a new parameter resource
- */
- parmHandle = NewHandle(sizeof PARM);
- FailNIL(parmHandle, kErrWritePreferenceResource);
- BlockMove(&PARM, *parmHandle, sizeof PARM);
- AddResource(
- parmHandle,
- kApplicationCreator,
- PARM_ResourceID,
- "\pParameters"
- );
- FailOSErr(ResError(), kErrWritePreferenceResource);
- }
- WriteResource(parmHandle);
- FailOSErr(ResError(), kErrWritePreferenceResource);
- ReleaseResource(parmHandle);
- parmHandle = NULL;
- FailOSErr(ResError(), kErrWritePreferenceResource);
- UpdateResFile(gParameterFileRefNum);
- FailOSErr(ResError(), kErrWritePreferenceResource);
- }
- CATCH {
- UseResFile(saveResFile);
- ErrorAlert(STATUS, MESSAGE, FALSE);
- if (parmHandle != NULL)
- ReleaseResource(parmHandle);
- CloseResFile(gParameterFileRefNum);
- gParameterFileRefNum = kNoParamFile;
- NO_PROPAGATE;
- }
- ENDTRY;
- UseResFile(saveResFile);
- FailOSErr(ResError(), kErrWritePreferenceResource);
- }
- gParameterUpdateNeeded = FALSE;
- }
-
- /*
- * Initialize the parameter array. The values will be replaced by the current
- * preferences values, if any are read. If we can't read a preferences resource,
- * these values (or whatever the user chooses) will be written.
- */
- void
- ParameterFactorySettings(void)
- {
- PARM.auditIdent = kDefaultAuditIdent;
- PARM.enableAudit = TRUE;
- PARM.auditRecords = kDefaultAuditRecords;
- PARM.logDisplayLines = kDefaultDisplayLines;
- PARM.fontSize = 9;
- GetFontName(applFont, PARM.fontName);
- }
-
- /*
- * This searches the preference file folder for files with a specific creator and
- * file type. This lets the user rename our preference file without harm.
- */
- OSErr
- SearchForCreatorType(
- short prefVRefNum,
- long prefDirID,
- StringPtr trueFileName
- )
- {
- CInfoPBRec specPBRec;
- OSErr status;
- register short i;
- #define SPEC (specPBRec.hFileInfo)
-
- CLEAR(specPBRec);
- SPEC.ioNamePtr = trueFileName;
- SPEC.ioVRefNum = prefVRefNum;
- for (i = 1;; i++) {
- SPEC.ioDirID = prefDirID;
- SPEC.ioFDirIndex = i;
- status = PBGetCatInfo(&specPBRec, FALSE);
- if (status != noErr)
- break;
- if (SPEC.ioFlFndrInfo.fdType == kPreferenceFileType
- && SPEC.ioFlFndrInfo.fdCreator == kApplicationCreator)
- break;
- }
- return (status);
- #undef SPEC
- }
-
-